package com.lion.common.modules.file.common.utils;

import com.lion.common.base.exceptions.CommonException;
import com.lion.utils.StringUtil;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @author Chris Chan
 * Create On 2025/8/28 下午4:56
 * Use for: 本地文件工具
 * Explain:
 */
public class LocalFileUtil {
    /**
     * 从URL获取字节数组
     *
     * @param urlStr URL字符串
     * @return 字节数组
     */
    public static byte[] getBytesByUrl(String urlStr) {
        try {
            URL url = new URL(urlStr);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            InputStream is = conn.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            final int BUFFER_SIZE = 2048;
            final int EOF = -1;
            int c;
            byte[] buf = new byte[BUFFER_SIZE];
            while (true) {
                c = bis.read(buf);
                if (c == EOF) {
                    break;
                }
                baos.write(buf, 0, c);
            }
            conn.disconnect();
            is.close();

            byte[] data = baos.toByteArray();
            baos.flush();
            return data;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 复制MultipartFile到一个存储位置
     *
     * @param file         要复制的文件
     * @param saveFilePath 要复制到的文件路径
     */
    public static void copy(MultipartFile file, String saveFilePath) {
        if (StringUtil.isEmpty(saveFilePath)) {
            throw CommonException.of(1, "文件存储位置必须提供");
        }
        if (null == file) {
            throw CommonException.of(1, "文件为空");
        }
        try {
            byte[] bytes = file.getBytes();
            save(bytes, saveFilePath);
        } catch (IOException e) {
            e.printStackTrace();
            throw CommonException.of(1, e.getMessage());
        }
    }

    /**
     * 将字节数组保存到文件
     * Java 7+的NIO API提供了更简洁和可靠的文件操作
     *
     * @param contentBytes 要保存的字节数组
     * @param saveFilePath 要保存的文件路径
     * @return 是否保存成功
     */
    public static void save(byte[] contentBytes, String saveFilePath) {
        File saveFile = createSaveFile(saveFilePath);

        try {
            // 一行代码完成写入，自动处理资源关闭
            java.nio.file.Files.write(saveFile.toPath(), contentBytes);
        } catch (IOException e) {
            e.printStackTrace();
            throw CommonException.create(1, e.getMessage());
        }
    }

    /**
     * 创建一个存储文件
     * 并且经过一系列检查
     *
     * @param saveFilePath 要保存的文件路径
     * @return 要保存的文件
     */
    public static File createSaveFile(String saveFilePath) {
        File saveFile = new File(saveFilePath);
        //判断文件是否存在 不覆盖 这个以后扩展为选择模式：覆盖和不覆盖
        if (saveFile.exists()) {
            throw CommonException.create(1, "文件已经存在");
        }
        //判断父文件夹是否存在
        File parentFile = saveFile.getParentFile();
        //不存在就创建
        if (!parentFile.exists()) {
            parentFile.mkdirs();
        } else {
            //否则还要判断一下是不是文件
            if (!parentFile.isDirectory()) {
                throw CommonException.create(1, "父文件夹已经存在，且不是一个文件夹");
            }
        }
        return saveFile;
    }
}
